const { ethers } = require("hardhat");

/**
 * 演示本地网络和真实网络的相似性
 */
async function main() {
    console.log("🧪 本地网络 vs 真实网络对比演示\n");
    
    // 获取网络信息
    const network = await ethers.provider.getNetwork();
    const [deployer] = await ethers.getSigners();
    
    console.log("📊 当前环境信息:");
    console.log(`网络: ${network.name} (Chain ID: ${network.chainId})`);
    console.log(`部署者: ${deployer.address}`);
    console.log(`余额: ${ethers.formatEther(await ethers.provider.getBalance(deployer.address))} ETH\n`);
    
    console.log("🔬 EVM功能测试:\n");
    
    // 1. 测试基本的区块链功能
    console.log("1️⃣ 区块链基础功能:");
    const blockNumber = await ethers.provider.getBlockNumber();
    const block = await ethers.provider.getBlock(blockNumber);
    console.log(`   当前区块高度: ${blockNumber}`);
    console.log(`   区块时间戳: ${new Date(Number(block.timestamp) * 1000).toLocaleString()}`);
    console.log(`   区块哈希: ${block.hash}`);
    
    // 2. 测试智能合约编译
    console.log("\n2️⃣ 智能合约编译:");
    try {
        const AuctionNFT = await ethers.getContractFactory("AuctionNFT");
        console.log("   ✅ 合约编译成功");
        console.log(`   ✅ 字节码长度: ${AuctionNFT.bytecode.length} 字符`);
        console.log(`   ✅ ABI函数数量: ${AuctionNFT.interface.fragments.length} 个`);
    } catch (error) {
        console.log("   ❌ 合约编译失败:", error.message);
    }
    
    // 3. 测试合约部署
    console.log("\n3️⃣ 合约部署测试:");
    try {
        const AuctionNFT = await ethers.getContractFactory("AuctionNFT");
        const startTime = Date.now();
        const nft = await AuctionNFT.deploy(deployer.address);
        await nft.waitForDeployment();
        const endTime = Date.now();
        
        console.log("   ✅ 合约部署成功");
        console.log(`   ✅ 合约地址: ${await nft.getAddress()}`);
        console.log(`   ✅ 部署耗时: ${endTime - startTime}ms`);
        
        // 4. 测试合约交互
        console.log("\n4️⃣ 合约交互测试:");
        const tokenURI = "https://example.com/test.json";
        const mintTx = await nft.mint(deployer.address, tokenURI);
        const receipt = await mintTx.wait();
        
        console.log("   ✅ NFT铸造成功");
        console.log(`   ✅ 交易哈希: ${receipt.hash}`);
        console.log(`   ✅ Gas使用: ${receipt.gasUsed.toString()}`);
        console.log(`   ✅ NFT拥有者: ${await nft.ownerOf(1)}`);
        
        // 5. 测试事件日志
        console.log("\n5️⃣ 事件日志测试:");
        const events = receipt.logs.filter(log => {
            try {
                return nft.interface.parseLog(log);
            } catch {
                return false;
            }
        });
        console.log(`   ✅ 捕获到 ${events.length} 个事件`);
        
    } catch (error) {
        console.log("   ❌ 测试失败:", error.message);
    }
    
    console.log("\n🎯 关键要点:");
    console.log("1. 本地网络实现了完整的以太坊协议");
    console.log("2. 智能合约字节码在本地和真实网络上完全相同");
    console.log("3. EVM执行环境和真实网络一致");
    console.log("4. 唯一区别是网络基础设施，不是功能");
    
    console.log("\n📋 本地测试的价值:");
    console.log("✅ 快速迭代开发");
    console.log("✅ 免费测试所有功能");
    console.log("✅ 完全控制测试环境");
    console.log("✅ 可重复的测试结果");
    console.log("✅ 调试和错误排查");
    
    console.log("\n🚀 部署到真实网络时:");
    console.log("• 相同的字节码");
    console.log("• 相同的ABI接口");
    console.log("• 相同的功能逻辑");
    console.log("• 只是运行在不同的网络上");
}

main()
    .then(() => process.exit(0))
    .catch((error) => {
        console.error("❌ 演示失败:", error);
        process.exit(1);
    });